package com.hmily.spring.samples.controller;

import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;

/**
 * <h1>接收所有URL的请求.</h1>
 *
 * @author hmilyylimh
 * ^_^
 * @version 0.0.1
 * ^_^
 * @date 2021-10-30
 */
@RestController
public class CommonController {

    public static final Map<String, Map<String, Object>> URL_MAP = new HashMap<>();

    /**
     * <h2>定义一个通用处理请求的方法，方法里面只有2个参数足以应对未来的任何业务逻辑的变化。</h2>
     *
     * @param request
     * @param response
     * @return
     */
    // @RequestMapping
    // @GetMapping
    // @PostMapping
    public Map<String, Object> request(HttpServletRequest request, HttpServletResponse response){
        // 取出请求方法的一个路径
        String uri = request.getRequestURI();

        // 通过 uri 能知道调用下游的哪个系统（那是由一系列的代码处理的，那么这里就简化从map里面直接拿），或者调用本系统的哪个公开方法（不太实际）
        // 因为我们网关要做的事情就是分发轻逻辑重分派

        // TODO 如何根据 URL 获取怎么调用远程的逻辑，这里暂时忽略，靠后序大家来处理
        // 比如调用dubbo接口，就可以采取泛化形式进行调用
        // 比如调用http接口，就得想办法写一个代理，封装怎么处理http请求，市场上是有封装Http请求的这样一个框架的

        // 想办法拿到远程调用后的结果
        Map<String, Object> remoteResp = URL_MAP.get(uri);
        return remoteResp;
    }

    static {
        // 手工注册几个内置的URL
        init();
    }

    private static void init() {
        URL_MAP.put("/hmily/hh", new HashMap<String, Object>(){{
            put("name", "hh");
        }});
        URL_MAP.put("/hmily/wy", new HashMap<String, Object>(){{
            put("name", "wy");
        }});
        URL_MAP.put("/hmily/zs", new HashMap<String, Object>(){{
            put("name", "zs");
        }});
    }
}
